    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO.Firebird;

import Biblioteca.VerificacaoErros;
import ClassesUnicas.Pessoa;
import DAO.DAOPessoa;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 * DAOPessoaFirebird

 Versao 1.0

 Data Criação 04/12/2013
 *
 * @author Igor
 */
public class DAOPessoaFirebird extends DAOConexaoFirebird implements DAOPessoa {
    //Outros metodos
    @Override
    public long gravaPessoa(Pessoa pessoa){
        long vReturn = -1;
        try {
            CallableStatement cs;
            cs = this.con.getCon().prepareCall("call GRAVA_PESSOA(?,?,?)");

            cs.setLong(1, pessoa.getIdPessoa());
            cs.setString(2, pessoa.getNome());
            cs.registerOutParameter(3, Types.INTEGER);
            cs.executeQuery();
            vReturn = cs.getLong(3);
            
            this.con.getStm().executeBatch();
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return vReturn;
    }
    
    @Override
    public ArrayList<Pessoa> buscaPessoas(){
        ResultSet result = null;
        ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
        Pessoa pessoa;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n" +
                                            "a.ID_PESSOA,\n" +
                                            "a.NOME,\n"+
                                            "count(b.ID_PESSOA) as JOGOS\n"+
                                            "from PESSOA a\n"+
                                            "left outer join JOGO b\n"+
                                            "on a.ID_PESSOA = b.ID_PESSOA\n"+
                                            "group by a.ID_PESSOA,\n"+
                                            "a.NOME");

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));
                pessoa.setQuantidadeJogos(result.getInt("JOGOS"));
                
                pessoas.add(pessoa);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoas;
    }

    @Override
    public Pessoa buscaPessoa(long idPessoa){
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n" +
                                            "a.ID_PESSOA,\n" +
                                            "a.NOME\n" +
                                            "from PESSOA a\n" +
                                            "where a.ID_PESSOA = " + idPessoa);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));
                
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoa;
    }
    
    @Override
    public Pessoa buscaPessoa(String nome){
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;
        try {
            result = this.select.executeQuery("select\n" +
                                            "a.ID_PESSOA,\n" +
                                            "a.NOME\n" +
                                            "from PESSOA a\n" +
                                            "where a.NOME = " + nome);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));
                
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pessoa;
    }

    @Override
    public long buscaPontuacaoMaxUltimoJogo(long idPessoa){
        long pontuacao = 0;
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;
        try {
            result = this.select.executeQuery("select max(PERC_ACERTO) as PERC_ACERTO_MAX from (\n" +
                                              "select distinct (select count(*) from IMAGEM_SUB_FASE z where z.ID_INSTANCIA_SUB_FASE = b.ID_INSTANCIA_SUB_FASE  and z.ACERTOU_RESPOSTA = 1)\n" +
                                              "*100/ count(c.ID_INSTANCIA_SUB_FASE) as PERC_ACERTO\n" +
                                              " from\n" +
                                              "(select first 1 a.ID_JOGO from INSTANCIA_JOGO a join JOGO b on a.ID_JOGO = b.ID_INSTANCIA_JOGO where b.ID_PESSOA = "+idPessoa+" order by a.DATA_INICIO desc) a\n" +
                                              "join INSTANCIA_SUB_FASE b\n" +
                                              "on b.ID_JOGO = a.ID_JOGO\n" +
                                              "join IMAGEM_SUB_FASE c\n" +
                                              "on b.ID_INSTANCIA_SUB_FASE = c.ID_INSTANCIA_SUB_FASE\n" +
                                              "group by b.ID_INSTANCIA_SUB_FASE\n" +
                                              ")");

            while (result.next()) {
                pontuacao = result.getLong("PERC_ACERTO_MAX");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return pontuacao;
    }
}
